freeslot(
	"MT_TEST",
	"SPR_TEST",
	"S_TEST_IDLE",
	"S_TEST_ATTACK1",
	"S_TEST_ATTACK2",
	"S_TEST_DIE",
	"MT_SWORD",
	"SPR_SWRD",
	"S_SWORD_IDLE",
	"S_SWORD_ATTACK1",
	"S_SWORD_ATTACK2",
	"S_SWORD_ATTACK3",
	"S_SWORD_ATTACK4",
	"S_SWORD_ATTACK5",
	"S_SWORD_ATTACK6",
	"S_SWORD_DIE",
	"MT_LOTUS",
	"SPR_LTUS",
	"SPR_LTFR",
	"S_LOTUS_IDLE",
	"S_LOTUS_ATTACK1",
	"S_LOTUS_ATTACK2",
	"S_LOTUS_ATTACK3",
	"S_LOTUS_DIE",
	"MT_LOTUS_FIRE",
	"MT_LOTUS_FIRE2",
	"S_LOTUS_FIRE1",
	"S_LOTUS_FIRE2",
	"S_LOTUS_FIRE3",
	"S_LOTUS_FIRE4",
	"MT_ROCK",
	"SPR_ROCK",
	"S_ROCK_IDLE",
	"S_ROCK_1",
	"S_ROCK_2",
	"S_ROCK_3",
	"S_ROCK_4",
	"MT_CRYSTAL",
	"SPR_S500",
	"SPR_CRYS",
	"S_CRYS1",
	"S_CRYS2",
	"S_CRYS3",
	"S_CRYS4",
	"S_CRYS5",
	"S_CRYS6",
	"S_CRYS7",
	"MT_DECOR_1",
	"SPR_DEC1",
	"S_DECOR_1",
	"MT_DECOR_2",
	"SPR_DEC2",
	"S_DECOR_2",
	"MT_DECOR_3",
	"SPR_DEC3",
	"S_DECOR_3",
	"MT_DECOR_4",
	"SPR_DEC4",
	"S_DECOR_4",
	"MT_DECOR_5",
	"SPR_DEC5",
	"S_DECOR_5",
	"MT_DECOR_6",
	"SPR_DEC6",
	"S_DECOR_6",
	"MT_DECOR_7",
	"SPR_DEC7",
	"S_DECOR_7",
	"MT_DECOR_8",
	"SPR_DEC8",
	"S_DECOR_8",
	"MT_DECOR_9",
	"SPR_DEC9",
	"S_DECOR_9",
	"MT_DECOR_10",
	"SPR_DECA",
	"S_DECOR_10",
	"MT_DECOR_11",
	"SPR_DECB",
	"S_DECOR_11",
	"MT_DECOR_12",
	"SPR_DECC",
	"S_DECOR_12",
	"MT_DECOR_13",
	"SPR_DECD",
	"S_DECOR_13",
	"MT_DECOR_14",
	"SPR_DECE",
	"S_DECOR_14",
	"MT_TWEETS",
	"S_TWEETS",
	"sfx_tweets",
	"MT_LEAF_MAIN",
	"S_LEAF",
	"MT_LEAF",
	"S_LEAF2",
	"S_LEAF3",
	"S_LEAF4",
	"S_LEAF5",
	"SPR_LEAF",
	"sfx_gate",
	"sfx_gatel",
	"MT_FLYFILL",
	"SPR_FLYW",
	"S_FLYG_1",
	"S_FLYG_2",
	"S_FLYG_3",
	"sfx_scrtx",
	"sfx_scrty",
	"sfx_scrtz",
	"MT_OBJ01",
	"MT_OBJ01B",
	"SPR_BBLB",
	"S_OBJ01A",
	"S_OBJ01B",
	"S_OBJ01C",
	"S_OBJ01D",
	"S_OBJ01E",
	"S_OBJ01F",
	"MT_OBJ02",
	"MT_OBJ02B",
	"SPR_BLBO",
	"S_OBJ02A",
	"S_OBJ02B",
	"S_OBJ02C",
	"S_OBJ02D",
	"S_OBJ02E",
	"S_OBJ02F",
	"MT_PAD",
	"SPR_LPAD",
	"S_PAD1",
	"MT_UNLOCK",
	"S_UNLK1",
	"S_UNLK2",
	"MT_UNLOCK2",
	"S_UNLK3",
	"S_UNLK4",
	"SPR_BTTN",
	"MT_GREENSPRING",
	"S_GSPR",
	"S_GSPR2",
	"S_GSPR3",
	"S_GSPR4",
	"S_GSPR5",
	"SPR_GSPR",
	"MT_DRSH",
	"S_DRSH",
	"MT_TKDR",
	"S_TKDR",
	"SPR_TKDR",
	"S_TKDR2",
	"S_TKDR3",
	"sfx_tkdr",
	"MT_GKEY",
	"SPR_GKEY",
	"S_GKEY",
	"S_GKEY2",
	"S_GKEY3"
)

mobjinfo[MT_TKDR] = {
	doomednum = 698,
	spawnstate = S_TKDR,
	deathstate = S_TKDR,
	reactiontime = TICRATE,
	radius = 32*FRACUNIT,
	height = 128*FRACUNIT,
	flags = MF_NOGRAVITY|MF_SOLID
}

states[S_TKDR] = {SPR_TKDR, FF_PAPERSPRITE|A, 1, A_None, 0, 0, S_TKDR}
states[S_TKDR2] = {SPR_TKDR, FF_PAPERSPRITE|A, 1, A_None, 0, 0, S_TKDR3}
states[S_TKDR3] = {SPR_TKDR, FF_PAPERSPRITE|B, 12, A_None, 0, 0, S_NULL}

addHook("MobjThinker", function(mobj,player)
	if not (mobj and mobj.valid)
		return end	
	for player in players.iterate
		
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		
		if mobj.state > S_TKDR
			P_SpawnMobj(mobj.x + P_RandomRange(-64,64)*mobj.scale, mobj.y + P_RandomRange(-64,64)*mobj.scale, mobj.z + P_RandomRange(0,128)*mobj.scale, MT_IVSP)
		end
		
		if mobjrange <= 100*FRACUNIT		---if youre at a certain distance...
		and player.keynum > 2
		and mobj.state == S_TKDR
			--P_KillMobj(mobj,mobj,nil)
			S_StartSound(player.mo, sfx_tkdr, player)
			S_StartSound(player.mo, 194, player)
			S_StartSound(player.mo, 195, player)
			P_SpawnGhostMobj(mobj)
			mobj.state = S_TKDR2
		end
		
	end
end,MT_TKDR
)


mobjinfo[MT_DRSH] = {
	doomednum = 699,
	spawnstate = S_DRSH,
	deathstate = S_DRSH,
	reactiontime = TICRATE,
	radius = 1*FRACUNIT,
	height = 1*FRACUNIT,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY
}

states[S_DRSH] = {SPR_NULL, A, 1, A_None, 0, 0, S_DRSH}

addHook("MobjThinker", function(mobj,player)
	if not (mobj and mobj.valid)
		return end	
	for player in players.iterate
		if mobj.tkdrstate == nil
			mobj.tkdrstate = 0
		end
		
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		local mobjlook = R_PointToAngle2(mobj.x, mobj.y, player.mo.x, player.mo.y)
		local playerlook = R_PointToAngle2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		
		
		
		mobj.tkdrstate = 0
		if mobjrange <= 600*FRACUNIT		---if youre at a certain distance...
		and player.keynum < 3
			mobj.tkdrstate = 1
			
		end
		
		if mobj.tkdrstate == 1
			player.mo.angle = playerlook	---stare at the player
			P_InstaThrust(player.mo, player.mo.angle, -10*FRACUNIT)
		end
	end
end,MT_DRSH
)


mobjinfo[MT_FLYFILL] = {
	doomednum = 664,
	spawnstate = S_FLYG_1,
	reactiontime = 500,
	deathstate = S_FLYG_2,
	deathsound = sfx_s3k6B,
	mass = 1000,
	damage = 1,
	speed = 0*FRACUNIT,
	radius = 32*FRACUNIT,
	height = 32*FRACUNIT,
	flags = MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIP
}

states[S_FLYG_1] = {SPR_FLYW, FF_FULLBRIGHT|A, 2, A_None, 0, 0, S_FLYG_1}
states[S_FLYG_2] = {SPR_FLYW, FF_FULLBRIGHT|A, 1, A_CustomPower, pw_tailsfly, 8*TICRATE, S_FLYG_3}
states[S_FLYG_3] = {SPR_FLYW, FF_FULLBRIGHT|A, 1, A_SpawnObjectRelative, 0, (0*65536)+MT_IVSP, S_NULL}


mobjinfo[MT_TEST] = {
	doomednum = 691,
	spawnstate = S_TEST_IDLE,
	seestate = S_TEST_ATTACK1,
	reactiontime = TICRATE,
	deathstate = S_XPLD1,
	speed = 2*FRACUNIT,
	radius = 32*FRACUNIT,
	height = 100*FRACUNIT,
	flags = MF_SPECIAL|MF_ENEMY
}

states[S_TEST_IDLE] = {SPR_POSS, A, 5, A_Look, 1, 0, S_TEST_IDLE}
states[S_TEST_ATTACK1] = {SPR_POSS, A, 2, A_FaceTarget, 1, 0, S_TEST_ATTACK2}
states[S_TEST_ATTACK2] = {SPR_POSS, A, 1, A_Thrust, 1, 0, S_TEST_ATTACK1}
states[S_TEST_DIE] = {SPR_POSS, A, 1, A_Explode, 1, 0, S_NULL}


mobjinfo[MT_LOTUS] = {
	doomednum = 692,
	spawnstate = S_LOTUS_IDLE,
	seestate = S_LOTUS_ATTACK1,
	reactiontime = TICRATE,
	deathstate = S_XPLD1,
	speed = 2*FRACUNIT,
	radius = 32*FRACUNIT,
	height = 8*FRACUNIT,
	flags = MF_PAIN
}

states[S_LOTUS_IDLE] = {SPR_LTUS, A, 1, A_Look, 1, 0, S_LOTUS_IDLE}
states[S_LOTUS_ATTACK1] = {SPR_LTUS, A, 1, A_FaceTarget, 3, 0, S_LOTUS_ATTACK2}
states[S_LOTUS_ATTACK2] = {SPR_LTUS, B, 10, A_PlaySound, 384, 1, S_LOTUS_ATTACK3}
states[S_LOTUS_ATTACK3] = {SPR_LTUS, A, 60, A_NapalmScatter, MT_LOTUS_FIRE+(5*65536), 200+(40*65536), S_LOTUS_ATTACK1}
states[S_LOTUS_DIE] = {SPR_LTUS, A, 1, A_Explode, 1, 0, S_NULL}


mobjinfo[MT_LOTUS_FIRE] = {
	doomednum = -1,
	spawnstate = S_LOTUS_FIRE1,
	seestate = S_LOTUS_FIRE2,
	reactiontime = 32,
	deathstate = S_XPLD1,
	raisestate = S_LOTUS_FIRE1,
	speed = 2*FRACUNIT,
	radius = 8*FRACUNIT,
	height = 8*FRACUNIT,
	flags = MF_PAIN|MF_RUNSPAWNFUNC|MF_MISSILE
}

states[S_LOTUS_FIRE1] = {SPR_LTFR, FF_FULLBRIGHT|A, 1, A_PlaySound, 432, 1, S_LOTUS_FIRE2}
states[S_LOTUS_FIRE2] = {SPR_LTFR, FF_FULLBRIGHT|A, 1, A_BunnyHop, 14, 0, S_LOTUS_FIRE3}
states[S_LOTUS_FIRE3] = {SPR_LTFR, FF_FULLBRIGHT|B, 2, A_MoveRelative, 0, 1, S_LOTUS_FIRE4}
states[S_LOTUS_FIRE4] = {SPR_LTFR, FF_FULLBRIGHT|A, 2, A_FaceTarget, 3, 0, S_LOTUS_FIRE3}

mobjinfo[MT_SWORD] = {
	doomednum = 665,
	spawnstate = S_SWORD_IDLE,
	seestate = S_SWORD_ATTACK1,
	reactiontime = TICRATE,
	deathstate = S_XPLD1,
	deathsound = sfx_pop,
	speed = 2*FRACUNIT,
	radius = 32*FRACUNIT,
	height = 80*FRACUNIT,
	flags = MF_SPECIAL|MF_ENEMY|MF_SHOOTABLE
}

states[S_SWORD_IDLE] = {SPR_SWRD, A, 10, A_Look, 1, 0, S_SWORD_IDLE}
states[S_SWORD_ATTACK1] = {SPR_SWRD, B, 4, A_FaceTarget, 3, 0, S_SWORD_ATTACK2}
states[S_SWORD_ATTACK2] = {SPR_SWRD, C, 1, A_PlaySound, 341, 1, S_SWORD_ATTACK3}
states[S_SWORD_ATTACK3] = {SPR_SWRD, C, 4, A_Thrust, 5, 0, S_SWORD_ATTACK4}
states[S_SWORD_ATTACK4] = {SPR_SWRD, D, 4, A_FaceTarget, 3, 0, S_SWORD_ATTACK5}
states[S_SWORD_ATTACK5] = {SPR_SWRD, A, 1, A_PlaySound, 341, 1, S_SWORD_ATTACK6}
states[S_SWORD_ATTACK6] = {SPR_SWRD, A, 4, A_Thrust, 5, 0, S_SWORD_ATTACK1}
states[S_SWORD_DIE] = {SPR_SWRD, A, 1, A_Explode, 1, 0, S_NULL}


mobjinfo[MT_ROCK] = {
	doomednum = 662,
	spawnstate = S_ROCK_IDLE,
	seestate = S_ROCK_IDLE,
	reactiontime = TICRATE,
	deathstate = S_ROCK_1,
	deathsound = 269,
	speed = 0*FRACUNIT,
	radius = 64*FRACUNIT,
	height = 64*FRACUNIT,
	flags = MF_SPECIAL|MF_RUNSPAWNFUNC|MF_NOGRAVITY
}

states[S_ROCK_IDLE] = {SPR_ROCK, A, 1, A_None, 1, 0, S_ROCK_IDLE}

states[S_ROCK_1] = {SPR_ROCK, A, 1, A_Knockback, 0, 0, S_ROCK_2}
states[S_ROCK_2] = {SPR_LTUS, A, 1, A_NapalmScatter, MT_TNTDUST+(6*65536), 50+(0*65536), S_ROCK_3}
states[S_ROCK_3] = {SPR_LTUS, A, 1, A_NapalmScatter, MT_ROCKCRUMBLE1+(5*65536), 100+(20*65536), S_ROCK_4}
states[S_ROCK_4] = {SPR_LTUS, A, 1, A_NapalmScatter, MT_ROCKCRUMBLE1+(3*65536), 200+(30*65536), S_NULL}



mobjinfo[MT_CRYSTAL] = {
	doomednum = 673,
	spawnstate = S_CRYS1,
	reactiontime = 500,
	deathstate = S_CRYS7,
	deathsound = sfx_antiri,
	mass = 1000,
	damage = 1,
	speed = 0*FRACUNIT,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	flags = MF_SPECIAL|MF_RUNSPAWNFUNC|MF_NOGRAVITY|MF_NOCLIP
}

states[S_CRYS1] = {SPR_CRYS, FF_FULLBRIGHT|FF_ANIMATE|A, 16, A_None, 8, 2, S_CRYS1}
states[S_CRYS7] = {SPR_NULL, FF_FULLBRIGHT|A, 1, A_AwardScore, 0, 0, S_CRYS2}
states[S_CRYS2] = {SPR_CRYS, FF_FULLBRIGHT|A, 1, A_SpawnObjectRelative, MT_SUPERSPARK, 0+(0*65536), S_CRYS3}
states[S_CRYS3] = {SPR_S500, FF_FULLBRIGHT|A, 5, A_BunnyHop, 2, 0, S_CRYS4}
states[S_CRYS4] = {SPR_S500, FF_FULLBRIGHT|A, 5, A_BunnyHop, 1, 0, S_CRYS5}
states[S_CRYS5] = {SPR_S500, FF_FULLBRIGHT|A, 5, A_BunnyHop, 0, 0, S_CRYS6}
states[S_CRYS6] = {SPR_S500, FF_FULLBRIGHT|A, 15, A_None, 0, 0, S_NULL}


mobjinfo[MT_DECOR_1] = {
	doomednum = 680,
	spawnstate = S_DECOR_1,
	seestate = S_DECOR_1,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_1] = {SPR_DEC1, A, 1, A_None, 0, 0, S_DECOR_1}

mobjinfo[MT_DECOR_2] = {
	doomednum = 681,
	spawnstate = S_DECOR_2,
	seestate = S_DECOR_2,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_2] = {SPR_DEC2, A, 1, A_None, 0, 0, S_DECOR_2}

mobjinfo[MT_DECOR_3] = {
	doomednum = 682,
	spawnstate = S_DECOR_3,
	seestate = S_DECOR_3,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_3] = {SPR_DEC3, A, 1, A_None, 0, 0, S_DECOR_3}

mobjinfo[MT_DECOR_4] = {
	doomednum = 683,
	spawnstate = S_DECOR_4,
	seestate = S_DECOR_4,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_4] = {SPR_DEC4, A, 1, A_None, 0, 0, S_DECOR_4}

mobjinfo[MT_DECOR_5] = {
	doomednum = 684,
	spawnstate = S_DECOR_5,
	seestate = S_DECOR_5,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_5] = {SPR_DEC5, A, 1, A_None, 0, 0, S_DECOR_5}

mobjinfo[MT_DECOR_6] = {
	doomednum = 685,
	spawnstate = S_DECOR_6,
	seestate = S_DECOR_6,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_6] = {SPR_DEC6, A, 1, A_None, 0, 0, S_DECOR_6}

mobjinfo[MT_DECOR_7] = {
	doomednum = 686,
	spawnstate = S_DECOR_7,
	seestate = S_DECOR_7,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_7] = {SPR_DEC7, A, 1, A_None, 0, 0, S_DECOR_7}

mobjinfo[MT_DECOR_8] = {
	doomednum = 687,
	spawnstate = S_DECOR_8,
	seesound = S_DECOR_8,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_8] = {SPR_DEC9, A, 1, A_None, 0, 0, S_DECOR_9}


mobjinfo[MT_DECOR_9] = {
	doomednum = 688,
	spawnstate = S_DECOR_9,
	seestate = S_DECOR_9,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_9] = {SPR_DEC9, A, 1, A_None, 0, 0, S_DECOR_9}

mobjinfo[MT_DECOR_10] = {
	doomednum = 689,
	spawnstate = S_DECOR_10,
	seestate = S_DECOR_10,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_10] = {SPR_DECA, A, 1, A_None, 0, 0, S_DECOR_10}

mobjinfo[MT_DECOR_11] = {
	doomednum = 690,
	spawnstate = S_DECOR_11,
	seestate = S_DECOR_11,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_11] = {SPR_DECB, A, 1, A_None, 0, 0, S_DECOR_11}

mobjinfo[MT_DECOR_12] = {
	doomednum = 693,
	spawnstate = S_DECOR_12,
	seestate = S_DECOR_12,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_12] = {SPR_DECC, A, 1, A_None, 0, 0, S_DECOR_12}

mobjinfo[MT_DECOR_13] = {
	doomednum = 694,
	spawnstate = S_DECOR_13,
	seestate = S_DECOR_13,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_13] = {SPR_DECD, A, 1, A_None, 0, 0, S_DECOR_13}

mobjinfo[MT_DECOR_14] = {
	doomednum = 695,
	spawnstate = S_DECOR_14,
	seestate = S_DECOR_14,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_14] = {SPR_DECE, A, 1, A_None, 0, 0, S_DECOR_14}



mobjinfo[MT_TWEETS] = {
	doomednum = 669,
	spawnstate = S_TWEETS,
	seestate = S_TWEETS,
	radius = 64*FRACUNIT,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_TWEETS] = {SPR_NULL, A, 1, A_None, 0, 0, S_TWEETS}

addHook("MobjThinker", function(mobj,player)
	for player in players.iterate
		
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		
		if mobjrange <= 2000*FRACUNIT		---if youre at a certain distance...
		and not S_SoundPlaying(player.mo, sfx_tweets)
			S_StartSound(player.mo, sfx_tweets, player)
		end
	end
end,MT_TWEETS
)

mobjinfo[MT_LEAF] = {
	doomednum = -1,
	spawnhealth = -1,
	spawnstate = S_LEAF2,
	seestate = S_LEAF2,
	speed = 0*FRACUNIT,
	radius = 1*FRACUNIT,
	height = 1*FRACUNIT,
	flags = MF_NOGRAVITY
}

states[S_LEAF2] = {SPR_LEAF, FF_PAPERSPRITE|A, 1, A_None, 0, 0, S_LEAF2}

mobjinfo[MT_LEAF_MAIN] = {
	doomednum = 696,
	spawnstate = S_LEAF,
	seestate = S_LEAF,
	reactiontime = TICRATE,
	speed = 0*FRACUNIT,
	radius = 32*FRACUNIT,
	height = 2*FRACUNIT,
	flags = MF_NOGRAVITY
}
states[S_LEAF] = {SPR_NULL, A, 10, A_None, 0, 0, S_LEAF}


addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid)
		return end	
		

	if mobj.leaftics == nil
		mobj.leaftics = 0
		mobj.zdrop = 0
		mobj.leafspd = 0
	end
	if mobj.leaftics < 25
		mobj.leaftics = $ + 1
	end
	if mobj.leaftics == 25
		mobj.leaftics = 0
		mobj.zdrop = P_RandomRange(-5,-2)*FRACUNIT
		mobj.leafspd = P_RandomRange(-3,3)*FRACUNIT

			
	end
		
	--mobj.angle = $ + ANG1*P_RandomRange(4,8)
	P_SetObjectMomZ(mobj, mobj.zdrop, nil)
	P_InstaThrust(mobj, mobj.angle, mobj.leafspd)	

	


	if P_IsObjectOnGround(mobj) 
	or mobj.eflags & MFE_TOUCHWATER
		P_KillMobj(mobj,mobj,nil)
	end
end,MT_LEAF
)

addHook("MobjThinker", function(mobj)
	for player in players.iterate
	local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		if not (mobj and mobj.valid)
		
		return end	
		if mobjrange >= 4096*FRACUNIT
		return end	
		
		if mobj.leaftics == nil
			mobj.leaftics = 0
		end
		if mobj.leaftics < 7
			mobj.leaftics = $ + 1
		end
		if mobj.leaftics == 7
		
			mobj.leaftics = 0
			P_SpawnMobj(mobj.x + P_RandomRange(-2048,2048)*FRACUNIT, mobj.y + P_RandomRange(-2048,2048)*FRACUNIT, mobj.z + 512*FRACUNIT + P_RandomRange(-128,128)*FRACUNIT,MT_LEAF)
		end
	end
end,MT_LEAF_MAIN
)

mobjinfo[MT_PAD] = {
	doomednum = 797,
	spawnstate = S_PAD1,
	seestate = S_PAD1,
	reactiontime = TICRATE,
	speed = 0*FRACUNIT,
	radius = 128*FRACUNIT,
	height = 2*FRACUNIT,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY
}

states[S_PAD1] = {SPR_LPAD,  FF_PAPERSPRITE|A, 1, A_None, 0, 0, S_PAD1}

addHook("MobjThinker", function(mobj)
	mobj.scale = 2*FRACUNIT/3
	mobj.renderflags =  $|RF_FLOORSPRITE|RF_NOSPLATBILLBOARD

end,MT_PAD
)


mobjinfo[MT_UNLOCK] = {
	doomednum = 796,
	spawnstate = S_UNLK1,
	seestate = S_UNLK1,
	reactiontime = TICRATE,
	speed = 0*FRACUNIT,
	radius = 64*FRACUNIT,
	height = 2*FRACUNIT,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY
}

states[S_UNLK1] = {SPR_BTTN,  FF_PAPERSPRITE|FF_FULLBRIGHT|A, 1, A_None, 0, 0, S_UNLK1}
states[S_UNLK2] = {SPR_BTTN,  FF_PAPERSPRITE|FF_FULLBRIGHT|B, 1, A_None, 0, 0, S_UNLK2}

addHook("MobjThinker", function(mobj,player)
	for player in players.iterate
	
		
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		local getangle = mobj.angle/(59500*200)
		
		mobj.renderflags =  $|RF_FLOORSPRITE|RF_NOSPLATBILLBOARD
		
		if player.mo.z <= mobj.z
		and mobjrange <= 64*FRACUNIT		---if youre at a certain distance...
		and mobj.state == S_UNLK1
			P_LinedefExecute(getangle, player.mo)
			mobj.state = S_UNLK2
			S_StartSound(player.mo, 319, player)	
			S_StartSound(player.mo, 192, player)	
		end
	end
end,MT_UNLOCK
)


mobjinfo[MT_UNLOCK2] = { --Holdable button
	doomednum = 795,
	spawnstate = S_UNLK3,
	seestate = S_UNLK3,
	reactiontime = TICRATE,
	speed = 0*FRACUNIT,
	radius = 64*FRACUNIT,
	height = 2*FRACUNIT,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY
}

states[S_UNLK3] = {SPR_BTTN,  FF_PAPERSPRITE|FF_FULLBRIGHT|A, 1, A_None, 0, 0, S_UNLK3}
states[S_UNLK4] = {SPR_BTTN,  FF_PAPERSPRITE|FF_FULLBRIGHT|B, 1, A_None, 0, 0, S_UNLK4}

addHook("MobjThinker", function(mobj,player)
	for player in players.iterate
	
		
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		local getangle = mobj.angle/(59500*200)
		
		mobj.renderflags =  $|RF_FLOORSPRITE|RF_NOSPLATBILLBOARD
		
		P_SetObjectMomZ(mobj,0*FRACUNIT, nil)
		if player.mo.z >= mobj.z
		and mobjrange > 64*FRACUNIT		---if youre at a certain distance...
		and mobj.state == S_UNLK4
			mobj.state = S_UNLK3
		end
		if player.mo.z <= mobj.z
		and mobjrange <= 64*FRACUNIT		---if youre at a certain distance...
			P_LinedefExecute(getangle, player.mo)
			if mobj.state == S_UNLK3
				S_StartSound(player.mo, 319, player)				
				mobj.state = S_UNLK4
			end
		end
	end
end,MT_UNLOCK2
)



mobjinfo[MT_GREENSPRING] = { --Holdable button
	doomednum = 793,
	spawnstate = S_GSPR,
	seestate = S_GSPR,
	reactiontime = TICRATE,
	speed = 0*FRACUNIT,
	radius = 32*FRACUNIT,
	height = 2*FRACUNIT,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY
}

states[S_GSPR] = {SPR_GSPR,  A, 1, A_None, 0, 0, S_GSPR}
addHook("MobjThinker", function(mobj,player)
	for player in players.iterate
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		

		if player.mo.z <= mobj.z + 32*FRACUNIT
		and player.mo.z >= mobj.z - 32*FRACUNIT
		and mobjrange <= 32*FRACUNIT		---if youre at a certain distance...
			player.mo.angle = mobj.angle
			P_InstaThrust(player.mo, mobj.angle, 50*FRACUNIT)
			P_SetObjectMomZ(player.mo,25*FRACUNIT, nil)
			player.powers[pw_justsprung] = 1
			player.mo.state = S_PLAY_SPRING
			P_ResetPlayer(player)
			mobj.state = S_GSPR
			S_StartSound(player.mo, 288, player)
		end
	end
end,MT_GREENSPRING
)

mobjinfo[MT_GKEY] = { --Holdable button
	doomednum = 789,
	spawnstate = S_GKEY,
	seestate = S_GKEY,
	reactiontime = TICRATE,
	speed = 0*FRACUNIT,
	radius = 32*FRACUNIT,
	height = 2*FRACUNIT,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY
}

states[S_GKEY] = {SPR_GKEY,  FF_ANIMATE|A, 32, A_None, 16, 2, S_GKEY}
states[S_GKEY2] = {SPR_GKEY, Q , 1, A_None, 0, 0, S_GKEY3}
states[S_GKEY3] = {SPR_GKEY, Q , 1, A_None, 0, 0, S_NULL}

addHook("MapLoad", do
	for player in players.iterate
		player.keynum = 0
	end
end
)

addHook("MobjThinker", function(mobj,player)
	for player in players.iterate
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		
		
		if player.keynum == nil
			player.keynum = 0
		end
		
		if mobj.tics & 4*TICRATE
		and mobjrange <= 4096*FRACUNIT		---if youre at a certain distance...
			P_SpawnMobj(mobj.x + P_RandomRange(-60,60)*FRACUNIT, mobj.y + P_RandomRange(-60,60)*FRACUNIT, mobj.z + P_RandomRange(60,-60)*FRACUNIT, MT_BOXSPARKLE)	
		end
		
		if player.mo.z <= mobj.z + 128*FRACUNIT
		and player.mo.z >= mobj.z - 128*FRACUNIT
		and mobjrange <= 64*FRACUNIT		---if youre at a certain distance...
			P_SpawnGhostMobj(mobj)
			if mobj.state == S_GKEY
				mobj.state = S_GKEY2
			end
			if mobj.state == S_GKEY2
				player.keynum = $ + 1
				S_StartSound(mobj, 196, player)
				S_StartSound(mobj, 188, player)
			end
		end
	end
end,MT_GKEY
)
---------
--OBJECT TEST
--------

addHook("PlayerThink",function(player)

	if player.statetime == nil
		player.statetime = 0
		end
	if player.statetime2 == nil
		player.statetime2 = 0
	end
end
)		


mobjinfo[MT_OBJ01] = {
	doomednum = 798,
	spawnstate = S_OBJ01A,
	deathstate = S_OBJ01E,
	reactiontime = TICRATE,
	radius = 32*FRACUNIT,
	height = 32*FRACUNIT,
	flags = MF_SPECIAL|MF_ENEMY|MF_SHOOTABLE
}

states[S_OBJ01A] = {SPR_BBLB, A, 1, A_None, 0, 0, S_OBJ01A}
states[S_OBJ01B] = {SPR_BBLB, B, 1, A_None, 0, 0, S_OBJ01B}
states[S_OBJ01C] = {SPR_BBLB, D, 1, A_None, 0, 0, S_OBJ01C}
states[S_OBJ01D] = {SPR_BBLB, C, 1, A_None, 0, 0, S_OBJ01D}
states[S_OBJ01E] = {SPR_BBLB, E, 3, A_NapalmScatter, MT_OBJ01B+(5*65536), 200+(40*65536), S_NULL}

mobjinfo[MT_OBJ01B] = {
	doomednum = -1,
	spawnstate = S_OBJ01F,
	radius = 1*FRACUNIT,
	height = 1*FRACUNIT,
	flags = MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY
}
states[S_OBJ01F] = {SPR_BBLB, F, 40, A_None, 0, 0, S_NULL}

addHook("MobjThinker", function(mobj,player)
	if not (mobj and mobj.valid)
		return end	
	for player in players.iterate
		if mobj.statetime == nil
			mobj.statetime = 0
		end
		
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		local mobjlook = R_PointToAngle2(mobj.x, mobj.y, player.mo.x, player.mo.y)
		
		if mobj.state >= S_OBJ01E	--if death frame appears...
			S_StartSound(mobj, 106, player)
			mobj.statetime = 0
		return end

		if (mobj.statetime > 0
		and player.mo.z > mobj.z + 128*FRACUNIT
		and player.mo.z < mobj.z - 128*FRACUNIT	)
			mobj.state = S_OBJ01A
			mobj.statetime = 0
		return end
		
		if mobjrange >= 400*FRACUNIT		---if youre at a certain distance...
		and mobjrange < 4096*FRACUNIT		---if youre at a certain distance...
			mobj.state = S_OBJ01A
			mobj.statetime = $ + 1	---increment state counter
			if mobj.statetime > 1
			and mobj.statetime < 40
				P_InstaThrust(mobj, mobj.angle, 2*FRACUNIT)
				if mobj.statetime & 8
					mobj.state = S_OBJ01B
					end
				end
			if mobj.statetime == 100
				mobj.angle = FixedAngle(P_RandomRange(0,359)*FRACUNIT*ANG1)
				mobj.statetime = 0	---reset player state counter
				end
			end
		if player.mo.z <= mobj.z + 128*FRACUNIT
		and player.mo.z >= mobj.z - 128*FRACUNIT	
		and mobjrange < 400*FRACUNIT		---if youre at a certain distance...
		and mobjrange < 4096*FRACUNIT		---if youre at a certain distance...
			mobj.state = S_OBJ01C
			mobj.statetime = $ + 1	---increment state counter
			if P_IsObjectOnGround(mobj) 
				mobj.state = S_OBJ01D
				end
			if mobj.statetime >= 30
				
				mobj.angle = mobjlook	---stare at the player
				mobj.statetime = 0	---reset player state counter
				end
			if mobj.statetime == 1
			and P_IsObjectOnGround(mobj) 
				P_SetObjectMomZ(mobj, 5*FRACUNIT, nil)
				P_InstaThrust(mobj, mobj.angle, 5*FRACUNIT)
				S_StartSound(mobj, 350, player)
				S_StartSound(mobj, 69, player)
			end
		end
	end
end,MT_OBJ01
)



mobjinfo[MT_OBJ02] = {
	doomednum = 798,
	spawnstate = S_OBJ02A,
	deathstate = S_OBJ02E,
	reactiontime = TICRATE,
	radius = 32*FRACUNIT,
	height = 32*FRACUNIT,
	flags = MF_SPECIAL|MF_ENEMY|MF_SHOOTABLE
}

states[S_OBJ02A] = {SPR_BLBO, A, 1, A_None, 0, 0, S_OBJ02A}
states[S_OBJ02B] = {SPR_BLBO, B, 1, A_None, 0, 0, S_OBJ02B}
states[S_OBJ02C] = {SPR_BLBO, D, 1, A_None, 0, 0, S_OBJ02C}
states[S_OBJ02D] = {SPR_BLBO, C, 1, A_None, 0, 0, S_OBJ02D}
states[S_OBJ02E] = {SPR_BLBO, E, 3, A_NapalmScatter, MT_OBJ02B+(5*65536), 200+(40*65536), S_NULL}

mobjinfo[MT_OBJ02B] = {
	doomednum = -1,
	spawnstate = S_OBJ02F,
	radius = 1*FRACUNIT,
	height = 1*FRACUNIT,
	flags = MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY
}
states[S_OBJ02F] = {SPR_BLBO, F, 40, A_None, 0, 0, S_NULL}

addHook("MobjThinker", function(mobj,player)
	if not (mobj and mobj.valid)
		return end	
	for player in players.iterate
		if mobj.obj2state == nil
			mobj.obj2state = 0
		end
		
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		local mobjlook = R_PointToAngle2(mobj.x, mobj.y, player.mo.x, player.mo.y)
		
		if mobj.state >= S_OBJ02E	--if death frame appears...
			S_StartSound(mobj, 106, player)
			mobj.obj2state = 0
		return end

		if (mobj.obj2state > 0
		and player.mo.z > mobj.z + 128*FRACUNIT
		and player.mo.z < mobj.z - 128*FRACUNIT	)
			mobj.state = S_OBJ02A
			mobj.obj2state = 0
		return end
		
		if mobjrange >= 400*FRACUNIT		---if youre at a certain distance...
		and mobjrange < 4096*FRACUNIT		---if youre at a certain distance...
			mobj.state = S_OBJ02A
			mobj.obj2state = $ + 1	---increment state counter
			if mobj.obj2state > 1
			and mobj.obj2state < 30
				P_InstaThrust(mobj, mobj.angle, 6*FRACUNIT)
				if mobj.obj2state & 8
					mobj.state = S_OBJ02B
					end
				end
			if mobj.obj2state >= 80
				mobj.angle = FixedAngle(P_RandomRange(0,359)*FRACUNIT*ANG1)
				mobj.obj2state = 0	---reset player state counter
				end
			end
		if player.mo.z <= mobj.z + 128*FRACUNIT
		and player.mo.z >= mobj.z - 128*FRACUNIT	
		and mobjrange < 400*FRACUNIT		---if youre at a certain distance...
		and mobjrange < 4096*FRACUNIT		---if youre at a certain distance...
			mobj.state = S_OBJ02C
			mobj.obj2state = $ + 1	---increment state counter
			if P_IsObjectOnGround(mobj) 
				mobj.state = S_OBJ02D
				end
			if mobj.obj2state >= 20
				
				mobj.angle = mobjlook	---stare at the player
				mobj.obj2state = 0	---reset player state counter
				end
			if mobj.obj2state == 1
			and P_IsObjectOnGround(mobj) 
				P_SetObjectMomZ(mobj, 8*FRACUNIT, nil)
				P_InstaThrust(mobj, mobj.angle, 7*FRACUNIT)
				S_StartSound(mobj, 350, player)
				S_StartSound(mobj, 69, player)				
			end
		end
	end
end,MT_OBJ02
)